package com.ljc.common;

import com.ljc.constant.RedisConstant;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * 计数器限流算法
 */
@Component
public class RedisTokenLimiter {

    /**
     * 过期时间，300秒后过期
     */
    private static final long EXPIRE_TIME = 300;
    @Resource
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 计数器限流算法，5分钟以内，每个手机号只能发送3次
     */
    public boolean tryAcquire(String phoneNum) {
        String key = RedisConstant.SMS_BUCKET_PREFIX + phoneNum;
        String count = stringRedisTemplate.opsForValue().get(key);
        // 如果Redis中没有数据，说明是第一次发送，设置过期时间5分钟
        if (StringUtils.isEmpty(count)) {
            stringRedisTemplate.opsForValue().set(key, "1");
            stringRedisTemplate.expire(key, EXPIRE_TIME, TimeUnit.SECONDS);
            return true;
        }
        if (Integer.parseInt(count) <= 3) {
            // 如果发送次数少于等于3次，增加记录的发送次数，并允许发送
            stringRedisTemplate.opsForValue().increment(key);
            return true;
        }
        // 否则不允许发送
        return false;
    }
}